Jinjaのテンプレートで使用する変数プレースホルダーを変更する
こんにちは。サービスグループの武田です。
JinjaというPythonのデファクトともい言えるテンプレートエンジンがあります。
さてこのJinjaですが、テンプレートエンジンというくらいですので、変数の埋め込みや制御構文が使用できます。
変数の埋め込み。
Hello, {{ name }}
if文の使用。
{% if cond %} Hi {% endif %}
Jinjaを使用する上でこの仕様はまったく困らないのですが、何らかの理由でプレースホルダーに使用する記号を変えたくなることもきっとあるでしょう。というわけでやってみました。
環境
$ pipenv --version pipenv, version 2020.6.2 $ python3 -V Python 3.8.3
またJinjaのバージョンは2.11.2
です。
やってみた
まずは適当なディレクトリを作成して環境を用意します。
$ mkdir /path/to/jinja2-test && cd $_ $ pipenv install $ pipenv install jinja2
簡単なスクリプトを用意します。
from jinja2 import Environment env = Environment() text = "Hello, {{ name }}" tpl = env.from_string(text) msg = tpl.render({"name": "Classmethod"}) print(msg)
実行してみます。
$ pipenv run python main.py Hello, Classmethod
問題なさそうですね。それではプレースホルダーをデフォルトの{{ foo }}
形式から${ foo }
形式に変えてみましょう。
from jinja2 import Environment env = Environment(variable_start_string="${", variable_end_string="}") text = "Hello, ${ name }" tpl = env.from_string(text) msg = tpl.render({"name": "Classmethod"}) print(msg)
ポイントはEnvironment()
の引数に指定しているvariable_start_string
とvariable_end_string
です。これらを指定することで変数プレースホルダーの記号を任意のものに変更できます。なお、ブロックやコメントの記号も変更可能です。
実行してみます。
$ pipenv run python main.py Hello, Classmethod
うまく動きました!
まとめ
簡単ですがプレースホルダーの変更を試してみました。既存のシステムからの移行で、どうしてもテンプレート内の記号が変えられない場合などに思い出してあげてください。